package com.java.test;


import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.Date;

/**
 * JDK1.8 新的时间API
 *
 * @author shkstart
 * @create 2021-01-07 14:51
 */
public class DateTimeJDK8Test_3 {
    //    @Test
//    public void test1(){
//        Date date=new Date(2021-1990,2-1,7);
//        System.out.println(date);
//    }
    /*
     *
     * localTime,LocalDate,LocalDateTime的使用
     * 说明：
     * 1.LocalDateTime相较于LocalTime和LocalDate 使用频率更高
     * 2.类似于Calendar
     *
     * */
    @Test
    public void test2() {
        //获取当前的日期时间 日期+时间
        LocalDate l1 = LocalDate.now();
        LocalTime l2 = LocalTime.now();
        LocalDateTime l3 = LocalDateTime.now();

        System.out.println(l1);
        System.out.println(l2);
        System.out.println(l3);

        //of():指定日期时间
        LocalDateTime of = LocalDateTime.of(2021, 1, 1, 15, 0, 0);
        System.out.println(of);
        System.out.println("---------------------------------------------");

        //getXxx()      获取相关属性
        System.out.println(l3.getHour());       //15
        System.out.println(l3.getMinute());     //9
        System.out.println(l3.getMonth());      //JANUARY
        System.out.println(l3.getDayOfMonth()); //7
        System.out.println(l3.getMonthValue());//1
        System.out.println(l3.getDayOfWeek());//THURSDAY
        System.out.println(l3.getDayOfYear());//7

        //体现不可变性
        //withDayOfMonth()  修改为  设置为相关属性
        LocalDateTime l4 = l3.withDayOfMonth(22);
        System.out.println(l3);         //7
        System.out.println(l4);         //22

        //plus()    加
        LocalDateTime l5 = l3.plusDays(2);
        System.out.println(l3);
        System.out.println(l5);
        //minus()  减
    }

    /*
     *
     * instant类
     *   类似于util下的Date类
     * */
    @Test
    public void test3() {
        //实例化Instant  now()获取的是本初子午线的地区当前时间
        Instant instant = Instant.now();
        System.out.println(instant);

        //atOffset():更改为当前时区
        OffsetDateTime o1 = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(o1);

        //toEpochMilli():获取自1970年1月1日0时0分0秒（UTC)开始的毫秒数  --->类似Date中的getTime()
        Long a = instant.toEpochMilli();
        System.out.println(a);      //1610005284135

        //ofEpochMilli(): 通过给定的毫秒数，获取Instant实例化对象  ---》类似Date（Long millis）
        Date d1 = new Date(1610005284135L);
        System.out.println(d1);     //Thu Jan 07 15:41:24 CST 2021
        Instant instant1 = Instant.ofEpochMilli(1610005284135L);
        System.out.println(instant1);   //2021-01-07T07:41:24.135Z

    }


    /*
        DateTimeFormatter:格式化或解析日期、时间
        类似与simpleDateFormat
    */

    @Test
    public void test4() {

        //方式一：预定义的标准格式。如：ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL__DATE_TIME
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        LocalDateTime l1 = LocalDateTime.now();
        //格式化 日期--字符串
        String s2 = dateTimeFormatter.format(l1);
        System.out.println(s2);
        //解析  字符串---日期
        TemporalAccessor l2 = dateTimeFormatter.parse("2021-01-07T16:06:04.6752701");

        System.out.println(l2);

        //方式二：本地化相关的格式：如：ofLocalizedDateTime(FormatStyle.LONG)
        //FormatStyle.LONG /FormatStyle.MEDIUM /FormatStyle.SHORT  适用于LocalDateTIme
        LocalDateTime l3 = LocalDateTime.now();
        DateTimeFormatter d2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        //格式化  日期--》字符串
        String s3 = d2.format(l3);
        System.out.println(s3);
        //解析   字符串--》日期
        String s4 = "2021/1/7 下午4:19";
        TemporalAccessor l4 = d2.parse(s4);
        System.out.println(l4);


        //重点：  方式三：自定义的格式：如：ofPattern("yyyy-MM-dd hh-mm-ss E")
        DateTimeFormatter d5 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh-mm-ss E");
        //格式化 日期--》字符串
        System.out.println("-----------------");
        LocalDateTime l5 = LocalDateTime.now();
        String s5 = d5.format(l5);
        System.out.println(s5);             //2021-01-07 04-27-37 周四
        //解析  字符串--》日期
        System.out.println("--------------");
        TemporalAccessor t1 = d5.parse(s5);
        System.out.println(t1);             //{SecondOfMinute=37, MilliOfSecond=0, NanoOfSecond=0, MicroOfSecond=0, MinuteOfHour=27, HourOfAmPm=4},ISO resolved to 2021-01-07

    }

}
